package br.org.bertol.mestrado.engine.optimisation;

import java.util.ArrayList;
import java.util.List;

import br.org.bertol.mestrado.Verify;
import br.org.bertol.mestrado.engine.optimisation.entity.AbstractUnit;
import br.org.bertol.mestrado.engine.optimisation.moo.ParetoDominace;

/**
 * Super classe de todos os métodos de busca.
 * @author contaqualquer
 * @param <U>
 */
/**
 * @author contaqualquer
 * @param <U>
 */
public abstract class AbstractMetaHeuristica<U extends AbstractUnit> extends
        Thread implements Tecninca {

    /**
     * Objeto Verify. Este objeto possue as matrizes de custo funções de custo.
     */
    protected transient Verify         verify;

    /**
     * Número de iterções de uma heurística.
     */
    protected final transient long     numIteracoes;

    /**
     * Fronteira de Pareto.
     */
    protected transient ParetoDominace paretoDominace;

    /**
     * Lista de objetos pareto.
     */
    protected final transient List<U>  listaPareto;

    /**
     * Construtor privado da classe.
     * @param veri
     *            Objeto verify
     * @param numIter
     *            número de iterações
     */
    protected AbstractMetaHeuristica(final Verify veri, final long numIter) {
        super();

        this.verify = veri;

        this.numIteracoes = numIter;

        paretoDominace = new ParetoDominace();

        listaPareto = new ArrayList<U>();

    }

    /**
     * Construtor privado da classe.
     * @param veri
     *            Objeto verify
     * @param numIter
     *            número de iterações
     */
    protected AbstractMetaHeuristica(final Verify veri, final long numIter,
        final List<U> swarm) {
        super();

        this.verify = veri;

        this.numIteracoes = numIter;

        paretoDominace = new ParetoDominace();

        listaPareto = new ArrayList<U>(swarm);

    }
}
